/**
 * 中文单位
 * @param val 参数
 * @param tags 保留小数位数
 * @param bool 不满足单位时是否保留小数 例如 10 => 10.00
 * @param str 单位后的字符 例如‘11万+'
 * @param NoZero 小数是否去0 例如 11.00万 => 11万 11.20亿 => 11.2亿
 * @param fen 比例100/1
 * @returns
 */
// 解决精度问题
import Big from 'big.js'

const f_numberW = function(
  val,
  tags = 0,
  { bool = false, str = '', NoZero = false, fen = false } = {}
) {
  let num = val
  if (typeof val !== 'number') {
    num = Number(val)
    if (isNaN(num)) {
      return '--'
    }
  }
  if (val === -1) {
    return '--'
  }
  if (!val) {
    num = 0
  }
  if (fen) {
    num = num / 100
  }
  const moneyUnits = ['', '万', '亿', '万亿']
  const dividend = 10000
  let curentNum = num
  // 转换数字
  let curentUnit = moneyUnits[0]
  // 转换单位
  for (let i = 0; i < 4; i++) {
    curentUnit = moneyUnits[i]
    if (strNumSize(curentNum) < 5) {
      break
    }
    curentNum = curentNum / dividend
  }
  const m = {
    num: 0,
    unit: ''
  }
  if (bool) {
    if (NoZero) {
      m.num = curentUnit
        ? toDecimal2NoZero(curentNum, tags)
        : curentNum.toFixed(tags)
    } else {
      m.num = curentNum.toFixed(tags)
    }
  } else {
    if (NoZero) {
      m.num = toDecimal2NoZero(curentNum, tags)
    } else {
      m.num = curentUnit
        ? curentNum.toFixed(tags)
        : toDecimal2NoZero(curentNum, tags)
    }
  }
  m.unit = curentUnit
  return curentUnit ? m.num + m.unit + str : m.num + m.unit
}

const f_number = function(
  val,
  tags = 0,
  { bool = false, str = '', NoZero = false, fen = false } = {}
) {
  let num = val
  if (typeof val !== 'number') {
    num = Number(val)
    if (isNaN(num)) {
      return '--'
    }
  }
  if (val === -1) {
    return '--'
  }
  if (!val) {
    num = 0
  }
  if (fen) {
    num = num / 100
  }
  const moneyUnits = ['', 'w', '亿', '万亿']
  const dividend = 10000
  let curentNum = num
  // 转换数字
  let curentUnit = moneyUnits[0]
  // 转换单位
  for (let i = 0; i < 4; i++) {
    curentUnit = moneyUnits[i]
    if (strNumSize(curentNum) < 5) {
      break
    }
    curentNum = curentNum / dividend
  }
  const m = {
    num: 0,
    unit: ''
  }
  if (bool) {
    if (NoZero) {
      m.num = curentUnit
        ? toDecimal2NoZero(curentNum, tags)
        : curentNum.toFixed(tags)
    } else {
      m.num = curentNum.toFixed(tags)
    }
  } else {
    if (NoZero) {
      m.num = toDecimal2NoZero(curentNum, tags)
    } else {
      m.num = curentUnit
        ? curentNum.toFixed(tags)
        : toDecimal2NoZero(curentNum, tags)
    }
  }
  m.unit = curentUnit
  return curentUnit ? m.num + m.unit + str : m.num + m.unit
}

// 保留2位小数，如：2，还会保留2 不会补0
function toDecimal2NoZero(x, tags) {
  let tos = 100
  if (tags === 1) {
    tos = 10
  } else {
    tos = 100
  }
  const f = Math.round(x * tos) / tos
  const s = f.toString()
  return s
}

function strNumSize(tempNum) {
  const stringNum = tempNum.toString()
  const index = stringNum.indexOf('.')
  let newNum = stringNum
  if (index !== -1) {
    newNum = stringNum.substring(0, index)
  }
  return newNum.length
}

// 时间转xx天xx小时xx分钟 （分钟单位）
function timeStamp(StatusMinute) {
  // console.log(StatusMinute)
  const day = parseInt(StatusMinute / 60 / 24)
  const hour = parseInt((StatusMinute / 60) % 24)
  let min = parseInt(StatusMinute % 60)
  if (StatusMinute > 0 < 60) {
    min = Math.ceil(StatusMinute % 60)
  }
  StatusMinute = ''
  if (day > 0) {
    StatusMinute = day + '天'
  }
  if (hour > 0) {
    StatusMinute += hour + '小时'
  }
  if (min > 0) {
    // console.log(min)
    StatusMinute += parseFloat(min) + '分钟'
  }
  return StatusMinute
}
/**
 * 过滤空值
 * @param val 参数 number类型数据过滤
 */
// 数量
function numDataFil(val) {
  if (val && val !== -1) {
    return (val / 100).toFixed(2)
  } else if (val === 0) {
    return 0
  } else {
    return '--'
  }
}
/**
 * 过滤空值
 * @param val 参数 字符串类型数据过滤
 */
function strDataFil(val) {
  if (val && val !== '' && val !== -1 && val !== '-1' && val !== 'null') {
    return val
  } else {
    return '--'
  }
}
/**
 * 收款账号类型  0银行卡，1支付宝，2微信, 3V任务，4余额冻结
 * @param val 参数
 */
function receivingType(val) {
  if (typeof val === 'string' && val !== '') {
    val = Number(val)
  }
  const list = new Map()
    .set(0, '银行卡')
    .set(1, '支付宝')
    .set(2, '微信')
    .set(3, 'V任务')
    .set(4, '余额冻结')
  return list.get(val) || '-'
}
/**
 * 截取空格(2020-07-18 22:22:22)取前面的
 * @param val 参数
 */
function splitDataf(val, index) {
  if (val) {
    return val.split(' ')[index || 0]
  }
}

// 计算价格
// 计算直播价 字符串
const getPrice = function(priceSale, discountAmount) {
  if (priceSale) {
    if (priceSale.split('-')[1]) {
      const saleMin = Number(priceSale.split('-')[0])
      const saleMax = Number(priceSale.split('-')[1])
      if (saleMin === saleMax) {
        return `¥${saleMin}`
      } else {
        return `¥${new Big(saleMin).minus(discountAmount)}~${new Big(
          saleMax
        ).minus(discountAmount)}`
      }
    } else {
      return `¥${new Big(priceSale).minus(discountAmount)}`
    }
  } else {
    return '--'
  }
}
// 在售价大小值作对比 unit:单位
const minMax = function(mins, maxs, { fen = true, unit = false } = {}) {
  if (mins === -1 && maxs === -1) {
    return '--'
  }
  if (mins === '' || mins === null) {
    return '--'
  }
  if (maxs === '' || maxs === null) {
    return '--'
  }
  let min, max
  if (fen) {
    min = Number((mins / 100).toFixed(2))
    max = Number((maxs / 100).toFixed(2))
  } else {
    min = Number(mins)
    max = Number(maxs)
  }
  if (min !== max) {
    if (unit) {
      return `${f_number(min)} - ${f_number(max)}`
    } else {
      return `${min}  -  ${max}`
    }
  } else {
    if (unit) {
      return `${f_number(min)}`
    } else {
      return `${min}`
    }
  }
}
// 计算直播价 有最大最小值字段
// priceSaleMin, 最小值
// priceSaleMax, 最大值
// discountAmount, 优惠金额
// reservation  预定金
const getPriceMinMax = function(
  priceSaleMin,
  priceSaleMax,
  discountAmount,
  reservation
) {
  if (
    priceSaleMin !== '' &&
    Number(priceSaleMin) > 0 &&
    priceSaleMax !== '' &&
    Number(priceSaleMax) > 0
  ) {
    priceSaleMin = priceSaleMin / 100
    priceSaleMax = priceSaleMax / 100
    if (discountAmount <= 0) {
      discountAmount = 0
    } else {
      discountAmount = discountAmount / 100
    }
    if (reservation) {
      if (priceSaleMin === priceSaleMax) {
        return `${new Big(priceSaleMin)
          .minus(discountAmount)
          .minus(reservation)}`
      } else {
        return `${new Big(priceSaleMin)
          .minus(discountAmount)
          .minus(reservation)}
          ~
          ${new Big(priceSaleMax).minus(discountAmount).minus(reservation)}`
      }
    } else {
      if (priceSaleMin === priceSaleMax) {
        return `${new Big(priceSaleMin).minus(discountAmount)}`
      } else {
        return `${new Big(priceSaleMin).minus(discountAmount)}~${new Big(
          priceSaleMax
        ).minus(discountAmount)}`
      }
    }
  } else {
    return `--`
  }
}
// 日期转为几天前
function getDateDiff(dateTime) {
  const day = 24 * 60 * 60 * 1000
  const hour = 60 * 60 * 1000
  const minute = 60 * 1000

  const newDate = new Date().getTime()
  const time = new Date(dateTime).getTime()
  const date = newDate - time

  const days = parseInt(date / day) > 0 ? `${parseInt(date / day)}天前` : ''
  const hours = parseInt(date / hour) > 0 ? `${parseInt(date / hour)}小时前` : ''
  const minutes =
    parseInt(date / minute) > 0 ? `${parseInt(date / minute)}分钟前` : ''
  if (days.length !== 0 && parseInt(date / day) > 7) {
    return dateTime
  } else if (days.length !== 0) {
    return days
  } else if (hours.length !== 0) {
    return hours
  } else if (minutes.length !== 0) {
    return minutes
  } else {
    return '刚刚'
  }
}

function isMoney(val) {
  return val ? '¥' + val : '--'
}

// 商品规格格式转化
function ancSku(item) {
  // let sku = eval('(' + item + ')')
  if (!item) {
    return ''
  }
  if (item[0] !== '[') {
    return ''
  }
  // 解决 skuJSON字符串中有反斜杠无法解析问题
  const list = item.replace(/\\/g, '\\\\')
  const sku = JSON.parse(list)
  let spec = ''
  if (sku) {
    const len = sku.length - 1
    sku.forEach((i, index) => {
      spec = spec + i.name + ' ¥' + i.price
      if (index < len) spec = spec + '、'
    })
  } else {
    spec = sku
  }
  return spec
}

/**
 * js 时间戳的转换（自定义格式）
 * @param  data 时间戳（秒）
 * @param  formatStr [日期格式]
 * @return (string) 日期时间
 */
function formatDate(data, formatStr) {
  if (!data) return '--'
  const date = new Date(data * 1000)
  const arrWeek = ['日', '一', '二', '三', '四', '五', '六']
  const str = formatStr
    .replace(/yyyy|YYYY/, date.getFullYear())
    .replace(/yy|YY/, addZero(date.getFullYear() % 100, 2))
    .replace(/mm|MM/, addZero(date.getMonth() + 1, 2))
    .replace(/m|M/g, date.getMonth() + 1)
    .replace(/dd|DD/, addZero(date.getDate(), 2))
    .replace(/d|D/g, date.getDate())
    .replace(/hh|HH/, addZero(date.getHours(), 2))
    .replace(/h|H/g, date.getHours())
    .replace(/ii|II/, addZero(date.getMinutes(), 2))
    .replace(/i|I/g, date.getMinutes())
    .replace(/ss|SS/, addZero(date.getSeconds(), 2))
    .replace(/s|S/g, date.getSeconds())
    .replace(/w/g, date.getDay())
    .replace(/W/g, arrWeek[date.getDay()])
  return str
}

function addZero(v, size) {
  for (let i = 0, len = size - (v + '').length; i < len; i++) {
    v = '0' + v
  }
  return v + ''
}

// 数字大于100转为99+
const numBigFil = function(v) {
  if (v && v > 99) {
    return '99+'
  } else {
    return v
  }
}

// 时间格式yyyy-mm-dd转为yyyy/mm/dd
function dateFormat(v) {
  if (v) {
    return v.replace(/-/g, '/')
  }
}

/**
 * 获取距离指定时间还有多少天
 * @param {String | Number | Date} dateTime 日期时间
 * @example
 * ```javascript
 *     getDistanceSpecifiedTime('2019/02/02 02:02:00');
 *     getDistanceSpecifiedTime(1549036800000);
 *     getDistanceSpecifiedTime(new Date("2019/2/2 00:00:00"));
 *     getDistanceSpecifiedTime('2019-02-02 02:02:00');
 * ```
 */
function getDistanceSpecifiedTime(dateTime) {
  if (!dateTime) {
    return '--'
  }
  const newTime = dateTime.replace('-', '/').replace('-', '/')
  // 指定日期和时间
  const EndTime = new Date(newTime)
  // 当前系统时间
  const NowTime = new Date()
  if (NowTime >= EndTime) {
    return '--'
  }
  const t = EndTime.getTime() - NowTime.getTime()
  const d = Math.floor(t / 1000 / 60 / 60 / 24)
  const h = Math.floor((t / 1000 / 60 / 60) % 24)
  const m = Math.floor((t / 1000 / 60) % 60)
  // const s = Math.floor((t / 1000) % 60)
  const html = d + ' 天' + h + ' 时' + m + ' 分'
  return html
}

// 过滤通用列表中头部意向主播展示
const tableExpAnc = function(val) {
  // console.log(val)
  let str = '--'
  if (val && val.length) {
    const arr = []
    val.forEach(item => {
      arr.push(item.anchorName)
    })
    str = arr.join('、')
  }
  return str
}

// 数字添加千位分隔符
function thousands(val) {
  let str_val = (val || 0).toString()
  let result = ''
  while (str_val.length > 3) {
    result = ',' + str_val.slice(-3) + result
    str_val = str_val.slice(0, str_val.length - 3)
  }
  if (str_val) {
    result = str_val + result
  }
  return result
}

// 微信/钉钉显示
function getChatNameOrNumber(ding, chat, { name = false, number = false } = {}) {
  if (name) {
    if (ding && !chat) {
      return '钉钉：'
    }
    if (!ding && chat) {
      return '微信：'
    }
    return '钉钉/微信：'
  }
  if (number) {
    if (ding && !chat) {
      return ding + '(钉钉)'
    }
    if (!ding && chat) {
      return chat + '(微信)'
    }
    if (ding && chat) {
      return ding + '(钉钉)/' + chat + '(微信)'
    }
    return '--'
  }
  return
}

export {
  f_number,
  f_numberW,
  timeStamp,
  numDataFil,
  strDataFil,
  receivingType,
  getDateDiff,
  splitDataf,
  isMoney,
  ancSku,
  formatDate,
  getPrice,
  getPriceMinMax,
  numBigFil,
  minMax,
  dateFormat,
  getDistanceSpecifiedTime,
  tableExpAnc,
  thousands,
  getChatNameOrNumber
} // 导出过滤函数
